{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "89886fac-dd02-4811-be9a-08c62f004652",
   "metadata": {},
   "source": [
    "<center><h1>鲁尔物联时序数据考题</h1>Author:dsy Time:2022-01-07</center>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "00ff2f20-c319-4fa5-9150-5b19e5b45356",
   "metadata": {},
   "source": [
    "> [本考题Gitee源代码](https://gitee.com/sy201855/time_series01)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "69930cd0-183c-4c56-8982-92cfb4a7006d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple\n",
      "Requirement already satisfied: statsmodels in /Users/dsy/.local/miniconda3/envs/py38_ml/lib/python3.8/site-packages (0.13.1)\n",
      "Requirement already satisfied: numpy>=1.17 in /Users/dsy/.local/miniconda3/envs/py38_ml/lib/python3.8/site-packages (from statsmodels) (1.22.0)\n",
      "Requirement already satisfied: patsy>=0.5.2 in /Users/dsy/.local/miniconda3/envs/py38_ml/lib/python3.8/site-packages (from statsmodels) (0.5.2)\n",
      "Requirement already satisfied: pandas>=0.25 in /Users/dsy/.local/miniconda3/envs/py38_ml/lib/python3.8/site-packages (from statsmodels) (1.3.5)\n",
      "Requirement already satisfied: scipy>=1.3 in /Users/dsy/.local/miniconda3/envs/py38_ml/lib/python3.8/site-packages (from statsmodels) (1.7.3)\n",
      "Requirement already satisfied: python-dateutil>=2.7.3 in /Users/dsy/.local/miniconda3/envs/py38_ml/lib/python3.8/site-packages (from pandas>=0.25->statsmodels) (2.8.2)\n",
      "Requirement already satisfied: pytz>=2017.3 in /Users/dsy/.local/miniconda3/envs/py38_ml/lib/python3.8/site-packages (from pandas>=0.25->statsmodels) (2021.3)\n",
      "Requirement already satisfied: six in /Users/dsy/.local/miniconda3/envs/py38_ml/lib/python3.8/site-packages (from patsy>=0.5.2->statsmodels) (1.16.0)\n"
     ]
    }
   ],
   "source": [
    "!pip install statsmodels"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3127ccc8-5071-4a90-a967-bfc851f2fcc5",
   "metadata": {},
   "source": [
    "# 1.业务理解"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "41d2987d-e5a2-4438-b81f-79596b0f4648",
   "metadata": {},
   "source": [
    "## 1.1 业务背景"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "61fa1ee9-eabb-4ee9-a5d2-abf90256ce1f",
   "metadata": {},
   "source": [
    "We provide one-dimensional KPI time series for financial device performance, which contains the timestamps and the  corresponding KPI values. Please design and implement a machine learning based solution to detect the anomaly points for this KPI time series."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32ae969d-5312-4869-ba33-9c794ce44c02",
   "metadata": {},
   "source": [
    "## 1.2 业务目标"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82d1acae-e91c-49ed-ac52-ad78cec8685e",
   "metadata": {},
   "source": [
    "**本质问题：时序数据的异常点检测问题**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e810485-461f-472b-afaa-4db08c449660",
   "metadata": {},
   "source": [
    "* In which way to build the algorithm model ?\n",
    "    * **从下面的内容3节中采用了AR、MA、ARMA、ARIMA、SARIMA模型等**\n",
    "* How to set the rule to define the anomaly points for this data?\n",
    "    * **从2.3小节中，以箱线图来确定异常点（初步定下大于60为异常点）**\n",
    "* How to evaluate the results? \n",
    "    * **使用均方误差来评估计算结果，如下面的3节**\n",
    "* If there are other recommended methods to detect the anomaly points?\n",
    "    * **从下面2.3部分，使用了另外一种K-Means聚类来划分异常点。**\n",
    "    * **回顾一下： 本文一共有以下几种异常值检测：1）箱线图 2）K-Means聚类 3) 通过模型如下AR、MA、ARMA、ARIMA等，对比真实值与预测值的偏差来判断**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1109cb7-dee7-4d44-9df8-49a5cccc1a26",
   "metadata": {},
   "source": [
    "## 1.3 业务数据"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35afdb4e-35fd-4c39-852a-b00e4d71352f",
   "metadata": {},
   "source": [
    "|_time|value|\n",
    "|:---|---|\n",
    "|2021/1/21 8:00|31.393|\n",
    "|2021/1/21 8:01|31.827|\n",
    "|2021/1/21 8:02|29.186|\n",
    "|2021/1/21 8:03|29.46|\n",
    "|2021/1/21 8:04|32.143|\n",
    "|2021/1/21 8:05|33.185|\n",
    "|2021/1/21 8:06|30.411|\n",
    "|....|....|"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5280cc50-b35f-4e14-9503-f6583b5a8c09",
   "metadata": {},
   "source": [
    "## 1.4 评估指标"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ffc808ee-e529-4919-bed9-98dbd73b3f1e",
   "metadata": {},
   "source": [
    "$$MSE = \\frac{1}{n}(y_i - \\widehat{y}_i)^2$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c17f09e8-51d8-4798-9ead-a6c1dee28098",
   "metadata": {
    "tags": []
   },
   "source": [
    "# 2. 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "87c95810-4570-4cb7-b994-5cbea7a02c7f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from scipy import stats\n",
    "import warnings\n",
    "from sklearn.metrics import mean_squared_error\n",
    "warnings.filterwarnings('ignore')\n",
    "from statsmodels.tsa.arima.model import ARIMA\n",
    "from statsmodels.datasets import co2\n",
    "from statsmodels.tsa.stattools import adfuller"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3da017d6-6062-427f-89c9-f5c26c88cca3",
   "metadata": {},
   "source": [
    "## 2.1 数据读取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0900bce8-adb9-42a8-b5e9-39bea7f5fa75",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>_time</th>\n",
       "      <th>value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021/1/21 8:00</td>\n",
       "      <td>31.393</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2021/1/21 8:01</td>\n",
       "      <td>31.827</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2021/1/21 8:02</td>\n",
       "      <td>29.186</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2021/1/21 8:03</td>\n",
       "      <td>29.460</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2021/1/21 8:04</td>\n",
       "      <td>32.143</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2021/1/21 8:05</td>\n",
       "      <td>33.185</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>2021/1/21 8:06</td>\n",
       "      <td>30.411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2021/1/21 8:07</td>\n",
       "      <td>33.866</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>2021/1/21 8:08</td>\n",
       "      <td>34.801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>2021/1/21 8:09</td>\n",
       "      <td>31.736</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            _time   value\n",
       "0  2021/1/21 8:00  31.393\n",
       "1  2021/1/21 8:01  31.827\n",
       "2  2021/1/21 8:02  29.186\n",
       "3  2021/1/21 8:03  29.460\n",
       "4  2021/1/21 8:04  32.143\n",
       "5  2021/1/21 8:05  33.185\n",
       "6  2021/1/21 8:06  30.411\n",
       "7  2021/1/21 8:07  33.866\n",
       "8  2021/1/21 8:08  34.801\n",
       "9  2021/1/21 8:09  31.736"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv(\"data/data.csv\")\n",
    "df.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f08badc8-6d85-462e-8907-2cd009be5def",
   "metadata": {},
   "source": [
    "## 2.2 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9eac32cd-783a-430c-9968-db6686414b49",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 18631 entries, 0 to 18630\n",
      "Data columns (total 2 columns):\n",
      " #   Column  Non-Null Count  Dtype  \n",
      "---  ------  --------------  -----  \n",
      " 0   _time   18631 non-null  object \n",
      " 1   value   18631 non-null  float64\n",
      "dtypes: float64(1), object(1)\n",
      "memory usage: 291.2+ KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "dc41b576-644e-4e9b-b2af-4c84c14b7328",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>18631.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>34.312158</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>22.168953</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>25.257000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>30.015000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>32.464000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>35.108000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1580.203000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              value\n",
       "count  18631.000000\n",
       "mean      34.312158\n",
       "std       22.168953\n",
       "min       25.257000\n",
       "25%       30.015000\n",
       "50%       32.464000\n",
       "75%       35.108000\n",
       "max     1580.203000"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3962977-0b25-4258-b25c-8e0d16be8979",
   "metadata": {},
   "source": [
    "## 2.3 value异常点检测"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e3645dd-289c-4c32-8f98-98d290736537",
   "metadata": {
    "tags": []
   },
   "source": [
    "### 2.3.1 Value 箱线图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ca86fbe4-a35a-4c02-b995-6164bdeaccdd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='value'>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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/WPrX/+dzHCt13bW7U1xfGZZf952e93uelMdp3nZb/tDz6KeD1u+Y1VVP1VV56rq3JNPPrkbMwHMxXPPPZeVlZUkycrKSh566KHrvsbDDz+cMf7/FyljjJnX2clzH3744Sv7dNlW+7b+OSsrKzl//vy2tzGrjWtt3OZWj8/DZmvOc5ZrbXv9Y2OMK+fATma41ms76/amOD6zrD9vu71ud72pjtO87Lf9oWdRz4ct37EaY7w/yfuT5NixY3vubZfDhw8nSe69996JJ9ncqVOn8sgnPz/1GDeEF1761Tn6LYf29PnANE6dOpULFy7k6aefzsrKSpaWlvKWt7zluq9z++2358Mf/vCVfzmuqpnX2clzb7/99jzwwANfFkZb7dv65ywtLeW2227LhQsXtrWNWW1ca+M2t3p8HjZbc56zXGvb6x+rqiSrgbWTGa712s66vSmOzyzrz9tur9tdb6rjNC/7bX/oWdTzwXesgBvGoUOHctNNq5e9AwcO5K677rrua5w4cSIHDx68cvvgwYMzr7OT5544ceLKPl221b6tf86BAwfyvve9b9vbmNXGtTZuc6vH52GzNec5y7W2vf6xgwcPXjkHdjLDtV7bWbc3xfGZZf152+11u+tNdZzmZb/tDz2Lej4IK+CGcfDgwRw/fjxVlePHj+eWW2657mvccsstOX78+JXbd9xxx8zr7OS5l59TVTly5MhM+7b+OcePH8/Ro0e3vY1ZbVxr4za3enweNltznrNca9vrH7vjjjtaM1zrtZ11e1Mcn1nWn7fdXre73lTHaV722/7Qs6jnw8L/8QqA7Thx4kTOnz8/199+nThxIsvLyxlj7Oi30Nt97uV9uvvuu3PffffN/K7E+uOwk23MaqtjvhuvyaxrznOWa21742OdGTZ7bbezvSmOzxTrTL1ud72pjtO87Lf9oWcRz4da/0XprRw7dmycO3dujuNs3+W//raXv1Nz+TtWz77urVOP8iI3P/FAkuzJ2Xbi5iceyBt9x4qrWIRrBQCw91XVI2OMYxvv91FAAACAJmEFAADQJKwAAACahBUAAECTsAIAAGgSVgAAAE3CCgAAoElYAQAANAkrAACAJmEFAADQJKwAAACahBUAAECTsAIAAGgSVgAAAE3CCgAAoElYAQAANAkrAACAJmEFAADQJKwAAACahBUAAECTsAIAAGgSVgAA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\n",
      "text/plain": [
       "<Figure size 1080x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(15,6))\n",
    "sns.boxplot(df.loc[0:300,'value'],orient='v',width=0.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9040ffac-9148-4c48-b058-6f2350fb73d5",
   "metadata": {},
   "source": [
    "从图上大致知道大于60的为异常点"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35452f8b-7cdf-44c7-8fd6-66586f4a7b5b",
   "metadata": {},
   "source": [
    "### 2.3.2 K-Means聚类划分异常点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "58e8fea3-856c-4282-8184-2484bcbafb25",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KMeans(n_clusters=2, random_state=10)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.cluster import KMeans\n",
    "# 划分为两个中心，一个是正常值，一个是异常值\n",
    "kmeans = KMeans(n_clusters=2, random_state=10)\n",
    "kmeans.fit(np.array(df['value']).reshape((-1,1)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "62e2e2a2-4d9e-4826-9122-fccab97c2c6d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 33.67236761],\n",
       "       [475.15162963]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "kmeans.cluster_centers_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "c5719046-4de6-4713-ab12-c462384c8ba1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, ..., 0, 0, 0], dtype=int32)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "kmeans.labels_"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87650fa4-0d42-4b1f-ab1d-44575c9c0775",
   "metadata": {},
   "source": [
    "## 2.4 平稳性检验"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ede5042-3ea8-4a23-ae15-2142a654122c",
   "metadata": {},
   "source": [
    "### 2.4.1 图像平稳性检验"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b5b1b92e-641d-4eef-a732-019666f896e2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([<AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>], dtype=object)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1296x864 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df[\"diff1\"] = df[\"value\"].diff(1).dropna()\n",
    "df[\"diff2\"] = df[\"diff1\"].diff(1).dropna()\n",
    "df.loc[:,[\"value\",\"diff1\",\"diff2\"]].plot(subplots=True, figsize=(18, 12),title=\"差分图\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce7fa93c-4473-47bf-a7c5-f9a1d12fb952",
   "metadata": {},
   "source": [
    "### 2.4.2 数值平稳性检验"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "b08156b8-4153-45e6-971a-91299964b01f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "p value: 4.9710161670531385e-28\n"
     ]
    }
   ],
   "source": [
    "res = adfuller(df['value'])\n",
    "print('p value:', res[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cec4af04-59be-4562-a658-5f5a26799e68",
   "metadata": {},
   "source": [
    "**p值显著<0.05，序列平稳。**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "541b5907-df39-4d04-aee3-948e8d7a82e8",
   "metadata": {},
   "source": [
    "## 2.5 白噪声检验"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "b360f2e1-2ac0-4edb-9891-a399ca6609d2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "         lb_stat  lb_pvalue\n",
      "6   39763.928995        0.0\n",
      "12  56522.689653        0.0\n",
      "24  72658.294808        0.0\n"
     ]
    }
   ],
   "source": [
    "from statsmodels.stats.diagnostic import acorr_ljungbox\n",
    "res = acorr_ljungbox(df['value'], lags=[6,12,24], return_df=True)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "25819e31-bed0-4367-a88e-140c0b7799c6",
   "metadata": {},
   "source": [
    "**各滞后期数下p值都为0均小于0.05，差分后的序列非白噪声，可以进行预测。**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c353df94-b4d3-4e47-9c56-8b1d415ac4b2",
   "metadata": {
    "tags": []
   },
   "source": [
    "# 3. 模型训练 & 模型评估"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "373fc71b-fcff-4b0f-826d-50d0029c2d68",
   "metadata": {},
   "source": [
    "## 3.0 评估指标函数定义"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "81bd0636-324d-4d74-95e0-9eaa971dfee9",
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluation(y_true, y_pred):\n",
    "    '''\n",
    "    评估指标：均方误差\n",
    "    '''\n",
    "    return mean_squared_error(y_true, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6f494e44-631e-4f62-9022-6ab214d04517",
   "metadata": {},
   "source": [
    "## 3.1 自回归 (AR)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "b828ed8a-69f6-4ea8-9a1f-6123dffdc82e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1        32.268463\n",
       "2        32.572318\n",
       "3        30.723286\n",
       "4        30.915120\n",
       "5        32.793557\n",
       "           ...    \n",
       "18627    43.338152\n",
       "18628    47.977185\n",
       "18629    60.681668\n",
       "18630    32.642330\n",
       "18631    32.936383\n",
       "Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from statsmodels.tsa.ar_model import AutoReg\n",
    "\n",
    "# fit model\n",
    "model = AutoReg(df['value'], lags=1)\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(1, len(df))\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "5dec7bf4-3698-4b62-a7ff-6d54abec611f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 44.192168415028824\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(df['value'],yhat))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a3f3ba0-0c31-4f62-907f-a63fae19e45e",
   "metadata": {},
   "source": [
    "## 3.2 移动平均线 (MA)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "1ad6ed9f-6330-4415-9097-3ae72abe610f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        34.312180\n",
       "1        33.185410\n",
       "2        33.696055\n",
       "3        32.201903\n",
       "4        33.020563\n",
       "           ...    \n",
       "18626    62.109617\n",
       "18627    27.277180\n",
       "18628    46.844308\n",
       "18629    46.173579\n",
       "18630    27.588226\n",
       "Name: predicted_mean, Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from statsmodels.tsa.arima.model import ARIMA\n",
    "# contrived dataset\n",
    "# fit model\n",
    "model = ARIMA(df['value'], order=(0, 0, 1))\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(0, len(df)-1)\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "8f6886e3-dac6-48f3-a82e-09b88b61c2c1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 340.1635228432471\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(df['value'],yhat))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec626d62-7de2-4723-acaa-c0c03c4a1f17",
   "metadata": {},
   "source": [
    "## 3.3 自回归移动平均线 (ARMA)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "75c8b306-9285-45d1-9616-2b31acd9422b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        34.312447\n",
       "1        32.268889\n",
       "2        32.233749\n",
       "3        31.006378\n",
       "4        30.669676\n",
       "           ...    \n",
       "18626    67.177028\n",
       "18627    54.141411\n",
       "18628    53.543822\n",
       "18629    60.312236\n",
       "18630    45.858826\n",
       "Name: predicted_mean, Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# ARMA example\n",
    "from statsmodels.tsa.arima.model import ARIMA\n",
    "# fit model\n",
    "model = ARIMA(df['value'], order=(2, 0, 1))\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(0, len(df)-1)\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "8bbbe3b1-538b-4049-be11-04dd20252b4c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 219.9139010121221\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(df['value'],yhat))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37625678-3d25-43e9-8177-13e78854fb3a",
   "metadata": {},
   "source": [
    "## 3.4 自回归综合移动平均线 (ARIMA)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "8a68d4c5-1c47-4de2-afef-1292acf57a18",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1        31.389437\n",
       "2        31.657941\n",
       "3        30.341951\n",
       "4        30.082674\n",
       "5        31.136074\n",
       "           ...    \n",
       "18627    55.579853\n",
       "18628    56.005356\n",
       "18629    63.544485\n",
       "18630    48.019781\n",
       "18631    43.269511\n",
       "Name: predicted_mean, Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# ARIMA example\n",
    "from statsmodels.tsa.arima.model import ARIMA\n",
    "# fit model\n",
    "model = ARIMA(df['value'], order=(1, 1, 1))\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(1, len(df), typ='levels')\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "9d1cffa3-bf89-4ed9-b28f-1ac22445dee9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 69.13861612223899\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(df['value'],yhat))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "deb89872-4d6b-4c2e-8e2e-5f3dcc21303b",
   "metadata": {},
   "source": [
    "## 3.5 季节性自回归综合移动平均 (SARIMA)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "1992c7b3-8c4b-4c2c-8046-cca553248f9c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1        31.389437\n",
       "2        31.657941\n",
       "3        30.341951\n",
       "4        30.082674\n",
       "5        31.136074\n",
       "           ...    \n",
       "18627    55.579853\n",
       "18628    56.005356\n",
       "18629    63.544485\n",
       "18630    48.019781\n",
       "18631    43.269511\n",
       "Name: predicted_mean, Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SARIMA example\n",
    "from statsmodels.tsa.statespace.sarimax import SARIMAX\n",
    "# contrived dataset\n",
    "# fit model\n",
    "model = SARIMAX(df['value'], order=(1, 1, 1), seasonal_order=(0, 0, 0, 0))\n",
    "model_fit = model.fit(disp=False)\n",
    "# make prediction\n",
    "yhat = model_fit.predict(1, len(df))\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "0aacb14d-6cfa-4e58-b110-37f6cc7e46d6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 69.13861612223899\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(df['value'],yhat))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02e16d77-29d2-465a-bbae-3bbbc4c0015a",
   "metadata": {},
   "source": [
    "## 3.6 具有外生回归量的季节性自回归整合移动平均线（SARIMAX）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "33d26b3a-f757-41fa-8e3a-dcee10fc2f73",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/dsy/.local/miniconda3/envs/py38_ml/lib/python3.8/site-packages/statsmodels/base/model.py:604: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n",
      "  warnings.warn(\"Maximum Likelihood optimization failed to \"\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0        3.139300e+01\n",
       "1        3.182700e+01\n",
       "2        2.918600e+01\n",
       "3        2.946000e+01\n",
       "4        3.214300e+01\n",
       "             ...     \n",
       "18626    1.853712e+19\n",
       "18627    1.853712e+19\n",
       "18628    1.853712e+19\n",
       "18629    1.853712e+19\n",
       "18630    1.853712e+19\n",
       "Name: predicted_mean, Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SARIMAX example\n",
    "from statsmodels.tsa.statespace.sarimax import SARIMAX\n",
    "from random import random\n",
    "# contrived dataset\n",
    "# fit model\n",
    "model = SARIMAX(df['value'], exog=df['value'], order=(1, 1, 1), seasonal_order=(0, 0, 0, 0))\n",
    "model_fit = model.fit(disp=False)\n",
    "# make prediction\n",
    "exog2 = [200+random()]\n",
    "yhat = model_fit.predict(0, len(df)-1, exog=[exog2])\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "93c84a26-b38b-4642-a1c5-10017ca38746",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 1.3193054864329115e+37\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(df['value'],yhat))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cd2ecff0-4acb-46e1-b9b9-def6b6962e95",
   "metadata": {},
   "source": [
    "## 3.7 简单指数平滑 (SES)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "dad7d188-cc07-429a-ae8b-38b241b769ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        31.162081\n",
       "1        31.255533\n",
       "2        31.486804\n",
       "3        30.555677\n",
       "4        30.112260\n",
       "           ...    \n",
       "18626    67.733480\n",
       "18627    59.425272\n",
       "18628    57.160885\n",
       "18629    63.156510\n",
       "18630    50.518037\n",
       "Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SES example\n",
    "from statsmodels.tsa.holtwinters import SimpleExpSmoothing\n",
    "# fit model\n",
    "model = SimpleExpSmoothing(df['value'])\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(0, len(df)-1)\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "2dac49e7-cfca-49c1-9f35-3c7641d07363",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 227.1213359951439\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(df['value'],yhat))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f121b45-28dd-4a3b-8ae9-660345112b92",
   "metadata": {},
   "source": [
    "## 3.8 霍尔特·温特的指数平滑（HWES）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "0622a400-b3e4-4bf7-bc1b-deadc703dcec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        31.146513\n",
       "1        31.246265\n",
       "2        31.481287\n",
       "3        30.552392\n",
       "4        30.110304\n",
       "           ...    \n",
       "18626    67.733490\n",
       "18627    59.425274\n",
       "18628    57.160885\n",
       "18629    63.156513\n",
       "18630    50.518033\n",
       "Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# HWES example\n",
    "from statsmodels.tsa.holtwinters import ExponentialSmoothing\n",
    "# fit model\n",
    "model = ExponentialSmoothing(df['value'])\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(0, len(df)-1)\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "2fd92160-9b03-410c-924d-0c7f8c65759b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 227.12133598187225\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(df['value'],yhat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "27beaab6-6e13-4592-9535-86e677fbbcee",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "4060c33b-f34d-486b-b332-52978c67d481",
   "metadata": {},
   "source": [
    "# 4. 模型预测 & 模型评估"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9faf572-ff83-477b-b26b-0ca8cb2dbb8a",
   "metadata": {},
   "source": [
    "## 4.0 切分数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "e89bf3dc-6811-4f87-babf-8bee3dc23103",
   "metadata": {},
   "outputs": [],
   "source": [
    "mid_point = 18600"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "7f1424ca-c959-4280-b55a-18d6c661f9c8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        31.393\n",
       "1        31.827\n",
       "2        29.186\n",
       "3        29.460\n",
       "4        32.143\n",
       "          ...  \n",
       "18596    32.362\n",
       "18597    32.498\n",
       "18598    31.153\n",
       "18599    30.328\n",
       "18600    36.201\n",
       "Name: value, Length: 18601, dtype: float64"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = df.loc[:mid_point,'value']\n",
    "train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "9fa03efe-016a-412d-869f-d5eddf627766",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "18601    31.156\n",
       "18602    29.860\n",
       "18603    30.340\n",
       "18604    31.184\n",
       "18605    31.704\n",
       "18606    32.575\n",
       "18607    33.535\n",
       "18608    30.912\n",
       "18609    51.090\n",
       "18610    43.168\n",
       "18611    36.342\n",
       "18612    48.253\n",
       "18613    50.555\n",
       "18614    44.751\n",
       "18615    45.770\n",
       "18616    43.066\n",
       "18617    45.999\n",
       "18618    42.742\n",
       "18619    39.850\n",
       "18620    53.367\n",
       "18621    45.627\n",
       "18622    52.094\n",
       "18623    40.753\n",
       "18624    47.089\n",
       "18625    99.518\n",
       "18626    47.204\n",
       "18627    53.830\n",
       "18628    71.976\n",
       "18629    31.927\n",
       "18630    32.347\n",
       "Name: value, dtype: float64"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test = df.loc[mid_point+1:,'value']\n",
    "test"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "46d9537f-0179-4367-95f5-7e10229a68e1",
   "metadata": {},
   "source": [
    "## 4.1 自回归 (AR)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "202132c7-e5a8-4135-ac1a-ad389ffe24f2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1        32.263395\n",
       "2        32.567332\n",
       "3        30.717799\n",
       "4        30.909685\n",
       "5        32.788631\n",
       "           ...    \n",
       "18627    34.297496\n",
       "18628    34.297459\n",
       "18629    34.297432\n",
       "18630    34.297413\n",
       "18631    34.297400\n",
       "Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from statsmodels.tsa.ar_model import AutoReg\n",
    "\n",
    "# fit model\n",
    "model = AutoReg(train, lags=1)\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(1, len(df))\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "4633fdda-0f37-4449-85ee-43dc29e76fab",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 290.6534968957113\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(test,yhat[mid_point+1:]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "59f42e03-888e-42a6-b329-7031c92eadd2",
   "metadata": {},
   "source": [
    "## 4.2 移动平均线 (MA)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "68fa6486-5cc5-473e-9be0-1da372dfcfe4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        34.296615\n",
       "1        33.175893\n",
       "2        33.684835\n",
       "3        32.191702\n",
       "4        33.009875\n",
       "           ...    \n",
       "18626    34.296615\n",
       "18627    34.296615\n",
       "18628    34.296615\n",
       "18629    34.296615\n",
       "18630    34.296615\n",
       "Name: predicted_mean, Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from statsmodels.tsa.arima.model import ARIMA\n",
    "# contrived dataset\n",
    "# fit model\n",
    "model = ARIMA(train ,order=(0, 0, 1))\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(0, len(df)-1)\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "7d68d684-c4d7-4703-8309-8509f00616d0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 290.48035442317666\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(test,yhat[mid_point+1:]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a18af138-d4d9-4e6c-b500-f872e589457c",
   "metadata": {},
   "source": [
    "## 4.3 自回归移动平均线 (ARMA)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "996d3adb-a826-489c-909f-5ff0301eeac3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        34.296450\n",
       "1        32.263606\n",
       "2        32.230211\n",
       "3        31.002735\n",
       "4        30.666714\n",
       "           ...    \n",
       "18626    34.155003\n",
       "18627    34.163363\n",
       "18628    34.171228\n",
       "18629    34.178629\n",
       "18630    34.185592\n",
       "Name: predicted_mean, Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# ARMA example\n",
    "from statsmodels.tsa.arima.model import ARIMA\n",
    "# fit model\n",
    "model = ARIMA(train, order=(2, 0, 1))\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(0, len(df)-1)\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "b8b38b73-229b-4e7e-9693-1e2d27562625",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 293.81386885834326\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(test,yhat[mid_point+1:]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e5f5f2c9-b8e5-4eb8-9fda-bb8d83de155c",
   "metadata": {},
   "source": [
    "## 4.4 自回归综合移动平均线 (ARIMA)¶"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "e2449d5f-c3fd-4c7b-9264-9ef69b7c9020",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1        31.389439\n",
       "2        31.658018\n",
       "3        30.341316\n",
       "4        30.082351\n",
       "5        31.136654\n",
       "           ...    \n",
       "18627    33.450221\n",
       "18628    33.450221\n",
       "18629    33.450221\n",
       "18630    33.450221\n",
       "18631    33.450221\n",
       "Name: predicted_mean, Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# ARIMA example\n",
    "from statsmodels.tsa.arima.model import ARIMA\n",
    "# fit model\n",
    "model = ARIMA(train, order=(1, 1, 1))\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(1, len(df), typ='levels')\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "d8d868dc-f8d9-4b31-8537-7586c6aef3ae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 307.1684173611632\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(test,yhat[mid_point+1:]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dd58f34e-021b-44b1-b9e3-3087b1312a29",
   "metadata": {},
   "source": [
    "## 4.5 季节性自回归综合移动平均 (SARIMA)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "817e5d08-cdc8-4e79-9c91-be9a9be7edc5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1        31.389439\n",
       "2        31.658018\n",
       "3        30.341316\n",
       "4        30.082351\n",
       "5        31.136654\n",
       "           ...    \n",
       "18627    33.450221\n",
       "18628    33.450221\n",
       "18629    33.450221\n",
       "18630    33.450221\n",
       "18631    33.450221\n",
       "Name: predicted_mean, Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SARIMA example\n",
    "from statsmodels.tsa.statespace.sarimax import SARIMAX\n",
    "# contrived dataset\n",
    "# fit model\n",
    "model = SARIMAX(train, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0))\n",
    "model_fit = model.fit(disp=False)\n",
    "# make prediction\n",
    "yhat = model_fit.predict(1, len(df))\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "9a818c25-f5c7-4c25-ab11-00bda9830dea",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 307.1684173611632\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(test,yhat[mid_point+1:]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4ab912b-4839-4d97-8d85-4f5b599e0ffc",
   "metadata": {},
   "source": [
    "## 4.6 具有外生回归量的季节性自回归整合移动平均线（SARIMAX）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "d9b066e4-79da-4055-a043-5497ead3669a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/dsy/.local/miniconda3/envs/py38_ml/lib/python3.8/site-packages/statsmodels/base/model.py:604: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n",
      "  warnings.warn(\"Maximum Likelihood optimization failed to \"\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0        3.139300e+01\n",
       "1        3.182700e+01\n",
       "2        2.918600e+01\n",
       "3        2.946000e+01\n",
       "4        3.214300e+01\n",
       "             ...     \n",
       "18626    8.209274e+18\n",
       "18627    8.209274e+18\n",
       "18628    8.209274e+18\n",
       "18629    8.209274e+18\n",
       "18630    8.209274e+18\n",
       "Name: predicted_mean, Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SARIMAX example\n",
    "from statsmodels.tsa.statespace.sarimax import SARIMAX\n",
    "from random import random\n",
    "# contrived dataset\n",
    "# fit model\n",
    "model = SARIMAX(train, exog=train, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0))\n",
    "model_fit = model.fit(disp=False)\n",
    "# make prediction\n",
    "exog2 = [200+random() for _ in range(len(df)-mid_point-1)]\n",
    "\n",
    "yhat = model_fit.predict(0\n",
    "                         , len(df)-1\n",
    "                         , exog=[exog2]\n",
    "                        )\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "f95499c2-d06a-4f42-b924-4ab842f9e78c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 6.739218737117922e+37\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(test,yhat[mid_point+1:]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "978083e3-4401-4f71-9997-1a75b5bca596",
   "metadata": {},
   "source": [
    "## 4.7 简单指数平滑 (SES)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "79394703-b51e-4067-a3ec-c73cc9f397ad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        31.143546\n",
       "1        31.244556\n",
       "2        31.480402\n",
       "3        30.551343\n",
       "4        30.109432\n",
       "           ...    \n",
       "18626    33.383046\n",
       "18627    33.383046\n",
       "18628    33.383046\n",
       "18629    33.383046\n",
       "18630    33.383046\n",
       "Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SES example\n",
    "from statsmodels.tsa.holtwinters import SimpleExpSmoothing\n",
    "# fit model\n",
    "model = SimpleExpSmoothing(train)\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(0, len(df)-1)\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "0489b0e7-f0a2-4fde-b966-dfa8b1b6b758",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 308.57260368738105\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(test,yhat[mid_point+1:]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e01414c5-5cc4-4be8-9e50-efa81b95bf52",
   "metadata": {},
   "source": [
    "## 4.8 霍尔特·温特的指数平滑（HWES）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "f18f9ba1-9b92-4560-8069-7249bb469fed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        31.145238\n",
       "1        31.245563\n",
       "2        31.481001\n",
       "3        30.551700\n",
       "4        30.109644\n",
       "           ...    \n",
       "18626    33.383046\n",
       "18627    33.383046\n",
       "18628    33.383046\n",
       "18629    33.383046\n",
       "18630    33.383046\n",
       "Length: 18631, dtype: float64"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# HWES example\n",
    "from statsmodels.tsa.holtwinters import ExponentialSmoothing\n",
    "# fit model\n",
    "model = ExponentialSmoothing(train)\n",
    "model_fit = model.fit()\n",
    "# make prediction\n",
    "yhat = model_fit.predict(0, len(df)-1)\n",
    "yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "1b76a475-57eb-4d1e-9dcd-5c1938db1716",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "evaluation: 308.57260021747163\n"
     ]
    }
   ],
   "source": [
    "print(\"evaluation:\",evaluation(test,yhat[mid_point+1:]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2fae18f2-6be1-40ca-be29-15c8f290493c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
